import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.params.SetParams;

import java.util.List;

public class RedisString {
    public static void test1(Jedis jedis) {
        System.out.println("mget 和 mset 的使用");
        // 先清空数据库. 要避免上一组测试的残留数据影响到下一组测试的结果.
        jedis.flushAll();

        jedis.mset("key1","111","key2","222","key3","333");

        List<String> values = jedis.mget("key1", "key2", "key3");

        System.out.println(values);
    }

    public static void test2(Jedis jedis) {
        System.out.println("setnx 和 setex 的使用");
        // 先清空数据库. 要避免上一组测试的残留数据影响到下一组测试的结果.
        jedis.flushAll();

        jedis.set("key1", "333");
        jedis.setnx("key1", "111"); //存在即不设置，不存在设置
        jedis.setex("key2", 10, "222");

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        List<String> mget = jedis.mget("key1", "key2");
        System.out.println(mget);
    }

    public static void test3(Jedis jedis) {
        System.out.println("incr 和 incrby 和 decr 和 decrby使用");
        // 先清空数据库. 要避免上一组测试的残留数据影响到下一组测试的结果.
        jedis.flushAll();

        // 这是 针对整数 Integer 类型的操作
        // 如果 上述的这些操作对应的key 不存在的话，就会自动创建一个key-value键值对，这里的value初始值为0
        jedis.incr("key1"); // 进行加一操作
        jedis.incrBy("key1", 10); // 对key1 这个键值对的value部分进行加10 操作

        jedis.set("key2", "11");
        jedis.decr("key2");
        jedis.decrBy("key2", 10);

        List<String> values = jedis.mget("key1", "key2");
        System.out.println(values);

        System.out.println("incrbyfloat 也是进行加减运算，可以对浮点数进行操作");

        jedis.set("key3", "10.5");
        jedis.incrByFloat("key3", 4.2);

        String value = jedis.get("key3");
        System.out.println(value);
    }

    public static void test4(Jedis jedis) {
        System.out.println("append 追加操作，不存在key的时候会新建追加元素后的结果，返回的是追加后的结果后的长度");
        // 先清空数据库. 要避免上一组测试的残留数据影响到下一组测试的结果.
        jedis.flushAll();

        jedis.append("key1", "abcde");

        jedis.append("key1", "fghy");
        String key1 = jedis.get("key1");
        System.out.println(key1);

        System.out.println("============================");

        System.out.println("getrange 截取操作，相当于是Java中的 substring");
        // 是一个左闭右闭的区间，并且可以为负数，表示倒数第几个位置的数据
        jedis.set("key2", "HelloRedis");
        String key2 = jedis.getrange("key2", 0, -1);
        System.out.println(key2);

        System.out.println("============================");

        System.out.println("setrange 替换操作");
        jedis.set("key3", "HelloWorld");
        System.out.println("替换前的字符串: " + jedis.get("key3"));
        long setrange = jedis.setrange("key3", 5, "Redis");
        System.out.println("替换后字符串的长度: " + setrange);
        System.out.println("替换后的字符串: " + jedis.get("key3"));

        System.out.println("============================");

        System.out.println("strlen 获取key对应的value的长度操作");
        jedis.set("key4", "0123456789");
        long key4 = jedis.strlen("key4");
        System.out.println(key4);
    }

    public static void main(String[] args) {
        // 连接到Redis 服务器中
        JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");

        try (Jedis jedis = jedisPool.getResource()) {
//            test1(jedis);
//            test2(jedis);
//            test3(jedis);
            test4(jedis);
        }
    }
}
